package com.shen.langchain4j.config;

import com.shen.langchain4j.service.FunctionAssistant;
import com.shen.langchain4j.service.InvoiceHandler;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.request.json.JsonObjectSchema;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.tool.ToolExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

/**
 * 大模型配置类
 */
@Slf4j
@Configuration
public class LLMConfig {
    @Bean("qwen")
    public ChatModel chatLanguageModel() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliyunQwen-apiKey"))
                .modelName("qwen3-next-80b-a3b-instruct")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
    }

//    /**
//     * 低级别，使用 ChatModel 和 ToolSpecification API
//     *
//     * @param chatModel 模型
//     * @return AI服务实例
//     */
//    @Bean
//    public FunctionAssistant functionAssistant(ChatModel chatModel) {
//        ToolSpecification toolSpecification = ToolSpecification.builder()
//                .name("开具发票助手")
//                .description("根据用户提供的开票信息，开具发票")
//                .parameters(JsonObjectSchema.builder()
//                        .addStringProperty("companyName", "公司名称")
//                        .addStringProperty("dutyNumber", "税号")
//                        .addStringProperty("amount", "开票金额")
//                        .build())
//                .build();
//        ToolExecutor toolExecutor = (toolExecutionRequest, memoryId) -> {
//            log.info("id : {}", toolExecutionRequest.id());
//            log.info("name : {}", toolExecutionRequest.name());
//            log.info("arguments : {}", toolExecutionRequest.arguments());
//            return "开具成功";
//        };
//        return AiServices.builder(FunctionAssistant.class)
//                .chatModel(chatModel)
//                .tools(Map.of(toolSpecification, toolExecutor))
//                .build();
//    }

    /**
     * 高级别，使用 AI 服务和带有 @Tool 注解的 Java 方法
     *
     * @param chatModel 模型
     * @return AI服务实例
     */
    @Bean
    public FunctionAssistant functionAssistant(ChatModel chatModel) {
        return AiServices.builder(FunctionAssistant.class)
                .chatModel(chatModel)
                .tools(new InvoiceHandler())
                .build();
    }
}
